
function _typeof3(e){
  // var _typeof2 = __webpack_require__(36);
  return typeof(e)
}
/* 243 */
/***/
function arrayToJSON(plainArray, ignoreDefualt) {
  return plainArray.map(function(e, index) {
    if (typeof e === 'undefined' || e === null) {
      return null; // 用null来存储，JSON格式不认undefined
    } else if (Array.isArray(e)) {
      return arrayToJSON(e, ignoreDefualt);
    } else if (e.toJSON) {
      if (typeof e.ignoreDefualt === 'undefined') {
        return e.toJSON(index.toString());
      } else {
        var originIgnoreDefault = e.ignoreDefualt;
        e.ignoreDefualt = ignoreDefualt;
        var result = e.toJSON(index.toString());
        e.ignoreDefualt = originIgnoreDefault;
        return result;
      }
    } else if ((typeof e === 'undefined' ? 'undefined' : _typeof3(e)) === 'object') {
      return plainObjectToJSON(e);
    } else {
      return e;
    }
  });
}

// 因为JSON格式不能存储undefined，
// 所以对于默认值是undefined的熟悉，一律存储为null！
// 反过来，需要把json中的null一律解析成undefined!
// 对于对象来说，可以用{}来表示使用默认值！
function defaultOptionsFilters(key, defaultOptions, plainObject) {
  // if (!defaultOptions[key]) { // 这样判断会导致值为undefined，但是有key的被过滤掉，实际不应过滤
  if (!(key in defaultOptions)) {
    // 换成这种形式！
    return false; // 没有默认属性的，不会打印！defaultOptions是一个限制项
    // 'undefined'可以是默认值，如果当前值也是undefined，则需要过滤掉！
    // } else if (typeof defaultOptions[key] === 'undefined') { // 有key但无定义，需要保留
    //     return true;
  } else if (defaultOptions[key] === null) {
    return true;
  } else if (Array.isArray(defaultOptions[key])) {
    // 经过测试 Array.prototype.every是可以遍历undefined元素的！
    if (defaultOptions[key].length === plainObject[key].length && defaultOptions[key].every(function(d, index) {
        return d === plainObject[key][index];
      })) {
      return false;
    } else {
      return true;
    }
  } else if (_typeof3(defaultOptions[key]) === 'object') {
    return true;
  } else {
    return plainObject[key] !== defaultOptions[key];
  }
}

// ignoreDefualt用来确定子元素是否需要忽略默认值，需要一级一级传递下去
function plainObjectToJSON(plainObject) {
  const _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
    defaultOptions = _ref.defaultOptions,
    filterKeys = _ref.filterKeys,
    ignoreDefualt = _ref.ignoreDefualt;

  var jsonObject = {};
  Object.keys(plainObject).filter(function(key) {
    var f1 = key.startsWith('_') || key.startsWith('$');
    var f2 = !!filterKeys ? filterKeys.includes(key) : false;
    var f3 = !!defaultOptions ? !defaultOptionsFilters(key, defaultOptions, plainObject) : false;

    var filter = !(f1 || f2 || f3);
    return filter;
  }).forEach(function(key) {
    var subDO = defaultOptions && defaultOptions[key];
    // 考虑值为undefined时候的存储
    // if (Array.isArray(plainObject[key])) {
    //     jsonObject[key] = arrayToJSON(plainObject[key]);
    if (typeof plainObject[key] === 'undefined' || plainObject[key] === null) {
      jsonObject[key] = null; // 用null来存储，JSON格式不认undefined
    } else if (Array.isArray(plainObject[key])) {
      jsonObject[key] = arrayToJSON(plainObject[key], ignoreDefualt);
    } else if (plainObject[key].toJSON) {
      if (typeof plainObject[key].ignoreDefualt === 'undefined') {
        jsonObject[key] = plainObject[key].toJSON(key);
      } else {
        var originIgnoreDefault = plainObject[key].ignoreDefualt;
        plainObject[key].ignoreDefualt = ignoreDefualt;
        jsonObject[key] = plainObject[key].toJSON(key);
        plainObject[key].ignoreDefualt = originIgnoreDefault;
      }
    } else if (_typeof3(plainObject[key]) === 'object') {
      jsonObject[key] = plainObjectToJSON(plainObject[key], {
        defaultOptions: subDO,
        ignoreDefualt
      });
    } else {
      jsonObject[key] = plainObject[key];
    }
  });

  return jsonObject;
}

export default plainObjectToJSON;
